package com.ipartek.formacion.migracion.beans;

import com.ipartek.formacion.migracion.enumeraciones.Rol;
import com.ipartek.formacion.migracion.excepciones.PersonaException;
import com.ipartek.formacion.migracion.util.Utilidades;

/**
 * Clase Persona que se corresponde con la tabla Persona
 * 
 * @author Curso
 * 
 */
public class Persona implements Comparable<Persona> {

	// id_persona: pk, not_null, ai (autoincremental)
	private int idPersona;
	// nombre
	private String nombre;
	// apellido1
	private String apellido1;
	// apellido2:
	private String apellido2;

	private Integer edad;
	// dni:
	private String dni;
	// email:
	private String email;

	private Rol rol;

	// Constructor con los campos minimos
	public Persona(String nombre, String apellido1, String apellido2,
			Integer edad, String email, String dni, String rol)
			throws PersonaException {
		super();

		this.setNombre(nombre);
		this.setApellido1(apellido1);
		this.setApellido2(apellido2);
		this.setEdad(edad);
		this.setDni(dni);
		this.setEmail(email);
		this.setRol(rol);
	}

	public Persona() {

	}

	public int getIdPersona() {
		return idPersona;
	}

	public void setIdPersona(int idPersona) {
		this.idPersona = idPersona;
	}

	public String getNombre() {
		return nombre;
	}

	/**
	 * Asignacion del nombre y realizacion de las validaciones
	 * 
	 * @param nombre
	 *            literal con el nombre de la persona
	 * @throws PersonaException
	 *             contiene el codigo y mensaje de error de las validaciones
	 */
	public void setNombre(String nombre) throws PersonaException {
		if (nombre != null) {
			String nombreSinBlancos = nombre.trim();
			if (nombreSinBlancos.length() >= 3) {
				this.nombre = nombreSinBlancos;
			} else {

				throw new PersonaException(PersonaException.COD_LONG_MINIMO,
						PersonaException.MSJ_LONG_MINIMO);
			}
		} else {
			throw new PersonaException(
					PersonaException.COD_CAMPO_OBLIGATORIO_NOTNULL,
					PersonaException.MSJ_CAMPO_OBLIGATORIO_NOTNULL);

		}
	}

	public String getApellido1() {
		return apellido1;
	}

	/**
	 * Asignacion del apellido1 y realizacion de las validaciones
	 * 
	 * @param apellido1
	 *            literal con el apellido1 de la persona
	 * @throws PersonaException
	 *             contiene el codigo y mensaje de error de las validaciones
	 */
	public void setApellido1(String apellido1) throws PersonaException {

		if (apellido1 != null) {
			String apellidoSinBlancos = apellido1.trim();
			if (apellidoSinBlancos.length() >= 3) {
				this.apellido1 = apellidoSinBlancos;
			} else {

				throw new PersonaException(PersonaException.COD_LONG_MINIMO,
						PersonaException.MSJ_LONG_MINIMO);
			}
		} else {
			throw new PersonaException(
					PersonaException.COD_CAMPO_OBLIGATORIO_NOTNULL,
					PersonaException.MSJ_CAMPO_OBLIGATORIO_NOTNULL);

		}

	}

	public String getApellido2() {
		return apellido2;
	}

	/**
	 * Asignacion del apellido2 y realizacion de las validaciones
	 * 
	 * @param apellido2
	 *            literal del apellido2 de la persona
	 * @throws PersonaException
	 *             contiene el codigo y mensaje de error de las validaciones
	 */
	public void setApellido2(String apellido2) throws PersonaException {
		if (apellido2 != null) {
			String apellidoSinBlancos = apellido2.trim();
			if (apellidoSinBlancos.length() >= 3) {
				this.apellido2 = apellidoSinBlancos;
			} else {

				throw new PersonaException(PersonaException.COD_LONG_MINIMO,
						PersonaException.MSJ_LONG_MINIMO);
			}
		} else {
			throw new PersonaException(
					PersonaException.COD_CAMPO_OBLIGATORIO_NOTNULL,
					PersonaException.MSJ_CAMPO_OBLIGATORIO_NOTNULL);

		}
	}

	public Integer getEdad() {
		return edad;
	}

	public void setEdad(Integer edad) throws PersonaException {
		if (edad < 18) {

			throw new PersonaException(PersonaException.COD_RANGO_EDAD,
					PersonaException.MSJ_RANGO_EDAD);
		} else {
			if (edad > 99) {
				throw new PersonaException(PersonaException.COD_RANGO_EDAD,
						PersonaException.MSJ_RANGO_EDAD);

			} else {

				this.edad = edad;
			}
		}

	}

	public String getDni() {
		return dni;
	}

	/**
	 * Asignacion de dni de persona
	 * 
	 * @param dni
	 *            literal que contiene el dni
	 * @throws PersonaException
	 *             contiene el codigo y mensaje de error de las validaciones
	 */
	public void setDni(String dni) throws PersonaException {

		if (dni != null) {
			if (Utilidades.checkDni(dni)) {
				this.dni = dni;
			} else {
				throw new PersonaException(PersonaException.COD_DNI_NO_VALIDO,
						PersonaException.MSJ_DNI_NO_VALIDO);
			}

		} else {

			throw new PersonaException(
					PersonaException.COD_CAMPO_OBLIGATORIO_NOTNULL,
					PersonaException.MSJ_CAMPO_OBLIGATORIO_NOTNULL);
		}
	}

	public String getEmail() {
		return email;
	}

	/**
	 * Asignacion del campo email a persona
	 * 
	 * @param email
	 *            literal con el email
	 * @throws PersonaException
	 *             contiene el codigo y mensaje de error de las validaciones
	 */
	public void setEmail(String email) throws PersonaException {
		if (email == null) {

			throw new PersonaException(
					PersonaException.COD_CAMPO_OBLIGATORIO_NOTNULL,
					PersonaException.MSJ_CAMPO_OBLIGATORIO_NOTNULL);
		} else {
			if (Utilidades.checkEmail(email.trim())) {

				this.email = email.trim();
			} else {
				throw new PersonaException(
						PersonaException.COD_EMAIL_NO_VALIDO,
						PersonaException.MSJ_EMAIL_NO_VALIDO);

			}
		}
	}

	public Rol getRol() {
		return rol;
	}

	/**
	 * Asignacion del rol
	 * 
	 * @param rol
	 *            literal con el rol de persona
	 * @throws PersonaException
	 *             contiene el codigo y mensaje de error de las validaciones
	 */
	public void setRol(String rol) throws PersonaException {
		if (rol != null) {

			if ("TRABAJADOR".equalsIgnoreCase(rol.trim())) {
				this.rol = Rol.TRABAJADOR;

			} else if ("JEFE".equalsIgnoreCase(rol.trim())) {
				this.rol = Rol.JEFE;

			} else if ("CLIENTE".equalsIgnoreCase(rol.trim())) {
				this.rol = Rol.CLIENTE;

			} else {
				throw new PersonaException(PersonaException.COD_ROL_NOVALIDO,
						PersonaException.MSJ_ROL_NOVALIDO);

			}
		} else {

			throw new PersonaException(
					PersonaException.COD_CAMPO_OBLIGATORIO_NOTNULL,
					PersonaException.MSJ_CAMPO_OBLIGATORIO_NOTNULL);
		}
	}

	@Override
	public int compareTo(Persona o) {

		return this.getDni().compareToIgnoreCase(o.getDni());
	}
}
